package com.tt.common.util;

import org.apache.commons.lang3.time.DateUtils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * 日期和时间
 * @author lenovo
 *
 */
public class DateUtil 
{

	/**
	 * 将指定的日期对象格式化为指定格式的字符串.W
	 * @param format
	 * @return
	 */
	private static final SimpleDateFormat getSimpleDateFormat(String format)
	{
		SimpleDateFormat sdf = null;
		try
		{
			sdf = new SimpleDateFormat(format);
		} catch (Exception e) 
		{
			throw new RuntimeException("日期格式错误--->"+format);
		}
		return sdf;
	}
	
	/**
	 * 将date时间格式化为指定的字符串格式
	 * @param date date日期
	 * @param format format后的字符串
	 * @return
	 */
	public static final String getDateStr(Date date,String format)
	{
		SimpleDateFormat sdf = getSimpleDateFormat(format);
		
		//返回当前时区的字符串
		sdf.setTimeZone(TimeZone.getDefault());
		
		return sdf.format(date);
	}
	
	/**
	 * 根据当前的日期时间获取指定格式的字符串日期时间
	 * @param format
	 * @return
	 */
	public static final String getDateStr(String format)
	{
		return getDateStr(new Date(),format);
	}
	
	/**
	 * 将字符串日期转换成date日期
	 * @param dateStr
	 * @param format
	 * @return
	 */
	public static final Date parseDate(String dateStr,String format)
	{
		if(dateStr==null||format==null)
		{
			throw new RuntimeException("参数不能为null");
		}
		SimpleDateFormat sdf =new SimpleDateFormat();
		sdf.setTimeZone(TimeZone.getDefault());
		try
		{
			Date date = sdf.parse(format);
			if(date!=null)
			{
				return date;
			}
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		throw new RuntimeException("无法解析时间"+dateStr);
	}
	
	/**
	 * 获取系统时间 时间类型是Date
	 * @return
	 */
	public static Date getSystemDate()
	{
		return new Date();
	}
	
	/**
	 * 获得增加一定天数的日期 返回date类型日期，
	 * @param date
	 * @param amount
	 * @return
	 */
	public static Date addDays(Date date,int amount)
	{
		return DateUtils.addDays(date, amount);
	}
	
	/**
	 * 获取增加几个月的日期
	 * @param date
	 * @param amount
	 * @return
	 */
	public static Date addMonths(Date date ,int amount)
	{
		return DateUtils.addMonths(date, amount);
	}
	
	/**
	 * 获得增加几小时后的日期
	 * @param date
	 * @param amount
	 * @return
	 */
	public static Date addHours(Date date,int amount)
	{
		return DateUtils.addHours(date, amount);
	}
	
	/**
	 * 获得增加N秒后的日期
	 * @param date
	 * @param amount 
	 * @return
	 */
	public static Date addSeconds(Date date,int amount)
	{
		return DateUtils.addSeconds(date, amount);
	}
	
	/**
	 * 获得增加几个星期后的日期
	 * @param date 原日期
	 * @param amount 增加的星期数 不能为负数
	 * @return
	 */
	public static Date addWeeks(Date date,int amount)
	{
		return DateUtils.addWeeks(date, amount);
	}
	
	/**
	 * 获得增加几年后的日期
	 * @param date 原日期
	 * @param amount 增加的年数 不能为负数
	 * @return
	 */
	public static Date addyears(Date date,int amount)
	{
		return DateUtils.addYears(date, amount);
	}
	
	/**
	 * 获得增加几分钟后的日期
	 * @param date 原日期 不能为null
	 * @param amount 增加的分钟数，不能为负数
	 * @return
	 */
	public static Date addMinutes(Date date,int amount)
	{
		return DateUtils.addMinutes(date, amount);
	}
	
	/**
	 * 获得当前时间 n分钟前的时间
	 * @param amount
	 * @return
	 */
	public static Date addMinuteDate(int amount)
	{
		Date tsp = getSystemDate();
		long ltime =  tsp.getTime()-amount*60*1000;
		return new Date(ltime);
	}
	
	/**
	 * 取得指定日期当月的最后一天日期
	 * @param date 当月的日期
	 * @return 当月最后的一天日期
	 */
	public static Date getMonthlastDay(Date date)
	{
		GregorianCalendar gc = new GregorianCalendar();
		gc.setTime(date);
		gc.add(Calendar.MONDAY, 1);
		int days = gc.get(Calendar.DAY_OF_MONTH);
		gc.add(Calendar.DATE, -days);
		Date dateTemp = gc.getTime();
		return dateTemp;
	}
	
	/**
	 * 获取系统时间 时间类型为Calendar(日历)
	 * @return
	 */
	public static Calendar getSystemCalendar()
	{
		return Calendar.getInstance();
	}
	
	/**
	 * 获取系统时间 时间类型是Timestamp 
	 * @return
	 */
	public static Timestamp getCurrentTimesamp()
	{
		return new Timestamp(System.currentTimeMillis());
	}
	
	/**
	 * 获取两个日期(date)之间的天数差
	 * @param befor 开始时间
	 * @param after 结束时间
	 * @return 天数
	 */
	public static long getDayDiff(Date befor ,Date after)
	{
		Calendar cld1work = Calendar.getInstance();
		Calendar cld2work = Calendar.getInstance();
		
		Calendar cld1 = Calendar.getInstance();
		Calendar cld2 = Calendar.getInstance();
		cld1work.setTime(befor);
		cld2work.setTime(after);
		cld1.clear();
		cld2.clear();
		cld1.set(cld1work.get(Calendar.YEAR), cld1work.get(Calendar.MONTH),cld1work.get(Calendar.DATE));
		cld2.set(cld2work.get(Calendar.YEAR), cld2work.get(Calendar.MONTH),cld2work.get(Calendar.DATE));
		long time1 = (cld1.getTime()).getTime();
		long time2 = (cld2.getTime()).getTime();
		return (time2-time1)/(1000 * 60 * 60 *24);
	}
	
	/**
	 * 取得两个日期的小时差
	 * @param befor 前一个日期
	 * @param after 后一个日期
	 * @return 取得两个日期的小时差
	 */
	public static long getHoursDiff(Date befor,Date after)
	{
		long lTime1 = befor.getTime();
		long lTime2 = after.getTime();
		return (lTime1-lTime2)/(1000* 60 * 60);
	}
	
	/**
	 * 比较两个日期对象是否在同一天
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameDay(Date date1,Date date2)
	{
		return DateUtils.isSameDay(date1, date2);
	}
	
	/**
	 * 判断传入的日期是否在今天之前 包括今天
	 * @param day 传入的日期
	 * @return  在今天之前返回true 反之
	 */
	public static boolean isBeforeToDay(Date day)
	{
		boolean Retrun = true;
		Calendar c = Calendar.getInstance();
		c.setTime(day);
		
		Calendar c2 = Calendar.getInstance();
		c2.setTime(new Date());
		
		Retrun = c.before(c2);
		
		return Retrun;
	}
	
	/**
	 * 判断传入的日期是否在今天之后 不 包括今天
	 * @param day
	 * @return
	 */
	public static boolean isAfterToDay(Date day)
	{
		boolean Retrun = true;
		Calendar c = Calendar.getInstance();
		c.setTime(day);
		
		Calendar c2 = Calendar.getInstance();
		c2.setTime(new Date());
		
		Retrun = c.after(c2);
		
		return Retrun;
	}
	
	/**
	 * 得到传入的日期的秒数
	 * @param date
	 * @return
	 */
	public static int getDateSecond(Date date)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.SECOND);
	}
	
	/**
	 * 得到传入日期的分钟数
	 * @param date
	 * @return
	 */
	public static int getDateMinute(Date date)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.MINUTE);
	}
	
	/**
	 * 获得传入日期的月份
	 * @param date
	 * @return
	 */
	public static int getDateMonth(Date date)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.MONTH);
	}
	
	/**
	 * 获得传入日期的年份
	 * @param date
	 * @return
	 */
	public static int getDateYear(Date date)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.YEAR);
	}
	
	/**
	 * 得到传入日期的小时数
	 * @param date
	 * @return
	 */
	public static int getDateHour(Date date)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.HOUR);
	}
	
	
}
